import 'package:aio/aio.dart';
import 'package:app/src/config/app_key.dart';
import 'package:app/src/http/bean/http_data.dart';
import 'package:app/src/manager/user_manager.dart';

///数据存储配置
class AppDataConfig {
  ///http请求，是否开启Log日志。
  static bool isEnableLog = false;

  // static bool isEnableLog = true;

  ///域名地址；无需输入http://,无需以/结束
  static String? _mAdress = null;

  ///获取服务器地址。
  static String? getAdress() {
    if (StringUtils.isEmpty(_mAdress)) {
      //优化获取用户输入的缓存域名
      _mAdress = prefs()?.getString(AppKey.getAdressKey());
    }
    return _mAdress?.trim();
  }

  ///存储缓存域名
  static void setAdress(String? mAdress) {
    if (StringUtils.isEmpty(mAdress)) {
      _mAdress = null;
      prefs()?.remove(AppKey.getAdressKey());
    } else {
      _mAdress = mAdress?.trim();
      prefs()?.setString(AppKey.getAdressKey(), _mAdress);
    }
  }

  ///历史域名地址
  static List<String>? _mAdressHistory = null;

  ///获取历史服务器地址。
  static List<String> getAdressHistory() {
    if (StringUtils.isEmpty(_mAdressHistory)) {
      //优化获取用户输入的缓存域名
      _mAdressHistory = prefs()?.getStringList(AppKey.getAdressHistoryKey());
    }
    if (_mAdressHistory == null) {
      _mAdressHistory = [];
      //这里，还是不要自动添加，防止手动删除不了最后一个记录。
      //fixme 这里第一次创建存储的时候，获取一下之前的域名。
      //fixme 这里只在第一次创建的时候，获取之前的域名；不会导致最后一个记录删不掉的问题。因为删除内容的时候，没有对_mAdressHistory置空。
      if (_mAdressHistory!.length <= 0) {
        var mAdress = AppDataConfig.getAdress();
        if (StringUtils.isNotEmpty(mAdress)) {
          addAdressHistory(mAdress);
        }
      }
    }
    return _mAdressHistory!;
  }

  ///存储缓存历史域名
  static void addAdressHistory(String? mAdress) {
    if (StringUtils.isNotEmpty(mAdress)) {
      if (_mAdressHistory == null) {
        //fixme 这里判断一下；防止getAdressHistory()和addAdressHistory()内部无限循环递归调用。
        getAdressHistory();
      }
      if (!_mAdressHistory!.contains(mAdress)) {
        //fixme 防重复添加
        _mAdressHistory!.add(mAdress!!);
        prefs()?.setStringList(AppKey.getAdressHistoryKey(), _mAdressHistory);
      }
    }
  }

  ///移除历史域名
  static void removeAdressHistory(String? mAdress) {
    if (StringUtils.isNotEmpty(mAdress)) {
      getAdressHistory();
      if (_mAdressHistory!.contains(mAdress)) {
        _mAdressHistory!.remove(mAdress!!); //fixme 清除内容即可，不要对其置空。
        prefs()?.setStringList(AppKey.getAdressHistoryKey(), _mAdressHistory);
      }
    }
  }

  ///清除历史域名
  static void clearAdressHistory() {
    _mAdressHistory?.clear(); //fixme 清除内容即可，不要对其置空。
    if (_mAdressHistory != null) {
      prefs()?.setStringList(AppKey.getAdressHistoryKey(), _mAdressHistory);
    }
  }

  static Factory? _factory = null;

  ///保存工厂
  static saveFactory(Factory? factory) {
    _factory = factory;
    prefs()?.setString(AppKey.getFactoryKey(), _factory?.jsonEncode());
  }

  ///获取工厂
  static Factory? getFactory() {
    if (StringUtils.isNotEmpty(_factory)) {
      return _factory!;
    }
    var json = prefs()?.getString(AppKey.getFactoryKey());
    if (StringUtils.isNotEmpty(json)) {
      _factory = Factory();
      GsonUtils.parseJson(json, _factory);
      return _factory;
    }
    return null;
  }

  static String? _API_SIGN_APPSECRET = null;

  ///获取缓存的密钥(完整的)
  static String getAppSecret() {
    if (StringUtils.isNotEmpty(_API_SIGN_APPSECRET)) {
      return _API_SIGN_APPSECRET!;
    }
    _API_SIGN_APPSECRET = prefs()?.getString(AppKey.getAppSecretKey());
    if (_API_SIGN_APPSECRET == null) {
      return "";
    }
    return _API_SIGN_APPSECRET!;
  }

  ///保存密钥(完整的)
  static void saveAppSecret(String? secret) {
    _API_SIGN_APPSECRET = secret?.trim();
    prefs()?.setString(AppKey.getAppSecretKey(), _API_SIGN_APPSECRET);
  }

  //保存密钥(用户自己输入的)
  static void saveCustomSecret(String? secret) {
    prefs()?.setString(AppKey.getAppSecretCustomKey(), secret);
  }

  ///获取缓存的密钥(用户手动输入的)
  static String? getCustomSecret() {
    return prefs()?.getString(AppKey.getAppSecretCustomKey());
  }

  /**
   * 密钥拼接
   * @param serverCode 服务器密钥
   * @param customCode 客户端用户输入密钥
   */
  static void saveAppCode(String? serverCode, String? customCode, int? num) {
    //print('密钥：$serverCode\t$customCode\t$num');
    if (serverCode != null && customCode != null && num != null) {
      //fixme 拼接插入到第num位。
      var newStr = StringUtils.insert(serverCode, customCode, num);
      //如用户手输：234-ZH
      //{"Code":"WSNBJHDR-188-6666-ZEKYFLEO1111000","Num":10,"MsgCode":"100","MsgDetail":"获取成功"}
      //WSNBJHDR-1234-ZH88-6666-ZEKYFLEO1111000
      //print('新密钥：$newStr');
      //保存密钥值
      saveAppSecret(newStr); //保存拼接后的真实密钥
      saveCustomSecret(customCode); //保存用户手输入的密钥。
    }
  }

  static String? _mToken;

  ///获取用户凭证Token
  static String getToken() {
    if (StringUtils.isNotEmpty(_mToken)) {
      return _mToken!;
    }
    //fixme 去除空格。（多一个空格对签名也会有影响，要注意。之前就犯了这个错）
    _mToken = prefs()?.getString(AppKey.getTokenKey())?.trim();
    if (_mToken == null) {
      return "";
    }
    return _mToken!;
  }

  ///保存Token
  static void setToken(String? token) {
    _mToken = token?.trim(); //fixme 去除空格。（多一个空格对签名也会有影响，要注意。之前就犯了这个错）
    prefs()?.setString(AppKey.getTokenKey(), _mToken);
  }

  static String? _mMobile;

  ///验证手机号
  static bool isValidation() {
    // return false;//不成功测试
    return true; //成功测试 fixme 现在发现，我们的验证码接口，无论是服务器还是我自己的。验证码接口调用成功，但实际并没有收到。所以现在把验证的方法暂时屏蔽。（2024.05.14）
    var MobileNum = UserManager.getUserInfo()?.MobileNum?.trim();
    var Mobile = getMobile()?.trim();
    if (StringUtils.isNotEmpty(MobileNum) &&
        StringUtils.isNotEmpty(Mobile) &&
        MobileNum == Mobile) {
      return true;
    }
    var adress = AppDataConfig.getAdress();
    var b = adress?.contains("192.168.1.5:") ?? false;
    //print("=============================$b\t$adress");
    if (b) {
      //fixme 本地测试系统不验证。方便测试。
      return true;
    } else {
      b = adress?.contains("test.app.bwg2017.com") ?? false;
      if (b) {
        if (UserManager.getUserInfo()?.PersonCode == "0") {
          //测试用户，不需要验证，方便测试。
          return true;
        }
      }
    }
    return false;
  }

  ///验证密码是否需要修改；true 需要修改密码；false 不需要修改密码
  ///fixme 对服务器配置和密码与账号是否相同都做了判断
  static bool isValidationWithPassword() {
    //return true;//fixme 测试
    var b = UserManager.getUserInfo()?.isNeedChangePassWord();
    if (b != null) {
      return b;
    }
    return false;
  }

  ///fixme 验证密码是否需要修改；只判断服务器是否开启了强制配置
  static bool isValidationWithPassword2() {
    //return true;//fixme 测试
    var b = UserManager.getUserInfo()?.isNeedChangePassWord2();
    if (b != null) {
      return b;
    }
    return false;
  }

  ///获取手机号
  static String? getMobile() {
    if (StringUtils.isNotEmpty(_mMobile)) {
      return _mMobile;
    }
    _mMobile = prefs()?.getString(AppKey.getKeyWithMobile())?.trim();
    return _mMobile;
  }

  ///设置手机号
  static void setMobile(String? mobile) {
    _mMobile = mobile?.trim();
    prefs()?.setString(AppKey.getKeyWithMobile(), _mMobile);
  }
}
